package v1

import (
	"blog_server/global"
	"blog_server/internal/service"
	"blog_server/pkg"
	"blog_server/pkg/app"
	"blog_server/pkg/errcode"
	"fmt"
	"github.com/gin-gonic/gin"
)

// 标签路由处理方法

type Tag struct {
}

func NewTag() Tag {
	return Tag{}
}

//func (t Tag) Get(ctx *gin.Context)  {}

// List 查询标签列表
// curl -X GET 'http://127.0.0.1:8000/api/v1/tags?name=xxx&state=xxx&page=xxx&page_size=xxx'
func (t Tag) List(ctx *gin.Context)  {
	param := service.TagListRequest{}
	err := app.NewResponse(ctx).ShouldBind(&param)
	fmt.Printf("参数：%v %v err:%v", param.Name, param.State, err)
	if err != nil {
		global.Logger.Errorf("app.shouldBind errs: %v", err)
		errRsp := pkg.InvalidParams.WithDetails(err.Error())
		app.NewResponse(ctx).ToErrorResponse(errRsp)
		return
	}
	
	s := service.New()
	
	total, err := s.CountTag(&service.TagCountRequest{Name: param.Name, State: param.State})
	if err != nil {
		global.Logger.Errorf("s.CountTag err: %v", err)
		app.NewResponse(ctx).ToErrorResponse(errcode.ErrorCountTagFail)
		return
	}
	pager := app.Pager{Page: app.GetPage(ctx), PageSize: app.GetPageSize(ctx)}
	tags, err := s.GetTagList(&param, pager)
	if err != nil {
		global.Logger.Errorf("s.GetTagList err:%v", err)
		app.NewResponse(ctx).ToErrorResponse(errcode.ErrorGetTagListFail)
		return
	}
	
	app.NewResponse(ctx).ToResponseList(tags, total)
}

// Create 添加一个标签
// 必传参数 name created_by
// curl -d 'name=re&created_by=pfa' -X POST 'http://127.0.0.1:8000/api/v1/tags?'
func (t Tag) Create(ctx *gin.Context)  {
	param := service.TagCreateRequest{}
	err := app.NewResponse(ctx).ShouldBind(&param)
	if err != nil {
		global.Logger.Errorf("app.shouldBind err: %v", err)
		errRsp := pkg.InvalidParams.WithDetails(err.Error())
		app.NewResponse(ctx).ToErrorResponse(errRsp)
		return
	}
	
	s := service.New()
	
	err = s.CreateTag(&param)
	if err != nil {
		global.Logger.Errorf("s.CreateTag err: %v", err)
		app.NewResponse(ctx).ToErrorResponse(errcode.ErrorCreateTagFail)
		return
	}
	
	app.NewResponse(ctx).ToResponse(gin.H{})
}

// Update 更新一个指定标签
// 必传参数：id 要更新的参数
// curl -d 'id=2&name=shpp&created_by=xiao&modified_by=hon&sate=0' -X PUT 'http://127.0.0.1:8000/api/v1/tags/aa?'
func (t Tag) Update(ctx *gin.Context)  {
	param := service.TagUpdateRequest{}
	err := app.NewResponse(ctx).ShouldBind(&param)
	if err != nil {
		global.Logger.Errorf("app.shouldBind err: %v", err)
		errRsp := pkg.InvalidParams.WithDetails(err.Error())
		app.NewResponse(ctx).ToErrorResponse(errRsp)
		return
	}
	
	s := service.New()
	
	err = s.UpdateTag(&param)
	if err != nil {
		global.Logger.Errorf("s.UpdateTag err: %v", err)
		app.NewResponse(ctx).ToErrorResponse(errcode.ErrorUpdateTagFail)
		return
	}
	
	app.NewResponse(ctx).ToResponse(gin.H{})
}

// Delete
// curl -X DELETE 'http://127.0.0.1:8000/api/v1/tags/aa?id=3'
func (t Tag) Delete(ctx *gin.Context)  {
	param := service.TagDeleteRequest{}
	err := app.NewResponse(ctx).ShouldBind(&param)
	if err != nil {
		global.Logger.Errorf("app.shouldBind err: %v", err)
		errRsp := pkg.InvalidParams.WithDetails(err.Error())
		app.NewResponse(ctx).ToErrorResponse(errRsp)
		return
	}
	s := service.New()
	
	err = s.DeleteTag(&param)
	if err != nil {
		global.Logger.Errorf("s.DeleteTag err: %v", err)
		app.NewResponse(ctx).ToErrorResponse(errcode.ErrorDeleteTagFail)
		return
	}
	
	app.NewResponse(ctx).ToResponse(gin.H{})
}

